#include <stdio.h>
#include <stdlib.h>
#include <gccore.h>
#include <wiiuse/wpad.h>

#include "infinity.h"

static void *xfb = NULL;
static GXRModeObj *rmode = NULL;

int initiate(void) {

  VIDEO_Init();
  WPAD_Init();

  // Obtain the preferred video mode from the system
  // This will correspond to the settings in the Wii menu
  rmode = VIDEO_GetPreferredMode(NULL);
  // Allocate memory for the display in the uncached region
  xfb = MEM_K0_TO_K1(SYS_AllocateFramebuffer(rmode));
  // Initialise the console, required for printf
  console_init(xfb,20,20,rmode->fbWidth,rmode->xfbHeight,rmode->fbWidth*VI_DISPLAY_PIX_SZ);
  // Set up the video registers with the chosen mode
  VIDEO_Configure(rmode);
  // Tell the video hardware where our display memory is
  VIDEO_SetNextFramebuffer(xfb);
  // Make the display visible
  VIDEO_SetBlack(FALSE);
  // Flush the video register changes to the hardware
  VIDEO_Flush();
  // Wait for Video setup to complete
  VIDEO_WaitVSync();
  if(rmode->viTVMode&VI_NON_INTERLACE) VIDEO_WaitVSync();

  return 0;
}

int run(void) {

  const int MAX_CHOICE = 1;
  int current_choice = 0;
  const char choices[MAX_CHOICE+1][9] = { "infinity" , "eclipseX" };
  Infinity * infinity;

  while(1) {

    WPAD_ScanPads();

    //u32 b_up = WPAD_ButtonsUp(0);
    u32 b_down = WPAD_ButtonsDown(0);
    //u32 b_held = WPAD_ButtonsHeld(0);

    if ( b_down & WPAD_BUTTON_HOME ) exit(0);
    if ( b_down & WPAD_BUTTON_A ) {
        switch ( current_choice ) {
            case 0: //Infinity
                infinity = new Infinity();
                infinity->run();
                break;
            case 1: //Eclipse
                //eclipse = new Eclipse
                //eclipse->run();
            default: //N.A.
                break;
        }
    }
    else {
        if ( b_down & WPAD_BUTTON_DOWN )
            current_choice++;
        if ( b_down & WPAD_BUTTON_UP )
            current_choice--;
        current_choice %= (MAX_CHOICE+1);
        printf("\x1b[2;2H%s",choices[current_choice]);
    }

    VIDEO_WaitVSync();
  }

  return 0;
}

//---------------------------------------------------------------------------------
int main(int argc, char **argv) {
//---------------------------------------------------------------------------------

  initiate();

  run();

  return 0;
}
